home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Games Collection 1
/
software vault.zip
/
software vault
/
CDR10
/
LL_LAND.ZIP
/
LL_KEY.INC
< prev
next >
Wrap
Text File
|
1993-05-10
|
6KB
|
181 lines
;; *************************************************************************
;; LL_KEY.INC - Lord Logic's Keyboard Interupt Routines - LL_KEY.ASM
;; - PRIMOR ViDeO GFX Engine v1.2 * Copyright (C) 1992-93 -
;;
;; No docs or nfo written for these routines yet. Given with LL_LAND as a
;; programming example. Focus of the example is the 3D Landscape, and not
;; these routines. They are pretty straight forward and easy to figure out.
;;
;; *************************************************************************
.data
MM equ 6
public LL_KEYFLAG
public LL_KEYBUF
public LL_KEYCHANGE
LL_KEYFLAG db 256 dup (0)
LL_KEYBUF db 0
LL_BUF db 256 dup (0)
LL_KEYHEAD dw offset LL_BUF
LL_KEYTAIL dw offset LL_BUF
LL_KEYCHANGE db 0
OLD_9_O dw offset NEW_9
OLD_9_S dw @code
.code
ll_keyhit proc
push ds
mov ax,@data
mov ds,ax
xor ax,ax
mov bx,LL_KEYTAIL
cmp bx,LL_KEYHEAD
je llkh_e
mov ax,1
llkh_e: pop ds
ret
ll_keyhit endp
ll_keyget proc
push ds
mov ax,@data ;; Set up OUR DATA SEGMENT!
mov ds,ax ;; :
xor ax,ax ;; Set NO RETURN FLAG
cmp LL_KEYBUF,0 ;; Check if the buffer is ACTIVE
je llkg_e ;; : If not, then exit . . .
llkg_1: call ll_keyhit ;; No keys in LL_BUF, so we will
or ax,ax ;; : wait until a key is hit.
jz llkg_1 ;; :
cli
mov bx,LL_KEYTAIL ;; Get a key from the buffer. FIFO
mov al,[bx] ;; :
inc bx ;; And update the pointers . . .
cmp bx,offset LL_BUF+255 ;;
jne llkg_2
mov bx,offset LL_BUF
llkg_2: cmp bx,LL_KEYHEAD ;; :
jne llkg_3 ;; Are there any keys left in BUF?
mov LL_KEYCHANGE,0 ;; : No? -> Clear the CHANGE FLAG
llkg_3: mov LL_KEYTAIL,bx ;; Update LL_KEYTAIL to new setting.
llkg_e: sti ;; Interrupts are fine now.
pop ds
xor ah,ah
ret
ll_keyget endp
;; *************************************************************************
;; void ll_keyswap();
;; ll_keyswap swaps between the original keyboard interrupt and our new and
;; improved interrupt.
;; *************************************************************************
ll_keyswap proc
push ds
push es
mov ax,@data
mov ds,ax
mov ax,03509h ;; Get interrupt 09h
int 21h ;; : return in ES:BX
mov ax,OLD_9_S
mov dx,OLD_9_O
push ds
mov ds,ax
mov ax,02509h ;; Set new interrupt
int 21h ;; : to address in DS:DX
pop ds
mov OLD_9_S,es ;; Save the old interrupt
mov OLD_9_O,bx
pop es
pop ds
ret
ll_keyswap endp
;; *************************************************************************
;; NEW_9() is the new keyboard interrupt.
;; It reads the scan code from the keyboard and modifies the flags table.
;; If LL_KEYBUF is set to ON (1) it also places the key in the buffer. Up
;; to 255 keys may be placed in the buffer.
;;
;; The flag table is set as follows: The high byte is set to the position
;; of the key, pressed=1, release=0. The low byte is set to 1 when the key
;; is pressed and left unmodified when the key is released.
;; *************************************************************************
NEW_9 proc far
push ax
push bx
push di
push ds
mov ax,@data ;; Set up to point to our DATA Segment
mov ds,ax ;; :
in ax,60h ;; Get SCAN CODE in AL, CONTROL in AH
mov bx,ax ;; Save a copy in BX
xchg ah,al ;; Put CONTROL in AL
or al,80h ;; Clear Keyboard of interrupt request
out 61h,al ;; :
and al,7Fh ;; :
out 61h,al ;; :
mov al,20h ;; Send generic EOI to PIC
out 20h,al ;; :
and bx,0007fh ;; Strip all but the scan code
shl bx,1 ;; Multiply by two to get our offset
test ah,10000000b ;; Check if key was RELEASED
jnz n9_4 ;; Yes?-> Act accordingly . . .
mov byte ptr [offset LL_KEYFLAG+BX],1 ;; Key HAS BEEN PRESSED
mov byte ptr [offset LL_KEYFLAG+BX+1],1 ;; Key IS BEING PRESSED
shr bx,1 ;; Set back to normal number
cmp LL_KEYBUF,0 ;; Is our KEYBOARD BUFFER ON?
je n9_e ;; : No? -> Continue as normal
mov di,LL_KEYHEAD ;; Check if BUFFER is FULL
cmp di,offset LL_BUF+255
jne n9_2
cmp LL_KEYTAIL,offset LL_BUF
jne n9_3
jmp n9_e
n9_2: inc di ;; :
cmp LL_KEYTAIL,di ;; :
je n9_e ;; : Yes?-> Don't put in buffer then.
dec di ;; :
n9_3: mov [di],bl ;; Put key in BUFFER
inc LL_KEYHEAD ;; Increment the HEAD needs to loop . . .
cmp LL_KEYHEAD,offset LL_BUF+255
jne n9_e
mov LL_KEYHEAD,offset LL_BUF
jmp n9_e ;; We're done pretty much now . . .
n9_4: mov byte ptr [offset LL_KEYFLAG+BX+1],0 ;; Key IS RELEASED
n9_e: mov LL_KEYCHANGE,1
pop ds
pop di
pop bx
pop ax
iret
NEW_9 endp